/*
 * @Author: hx 2542123711@QQ.com
 * @Date: 2024-11-28 16:12:06
 * @LastEditors: hx 2542123711@QQ.com
 * @LastEditTime: 2024-11-28 16:54:47
 * @FilePath: /class_process-signal/sigsave/mysignal.cc
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
#include <iostream>
#include <unistd.h>
#include <signal.h>

using namespace std;

void PrintPending(sigset_t &set)
{
    for(int signo=31; signo>=1; signo--)
    {
        //如果signo号信号在位图中，我们就输出1，否则输出0
        if(sigismember(&set, signo))
        {
            cout << "1";
        }
        else
        {
            cout <<"0";
        }
    }
    cout << "\n\n";
    sleep(1);
}

void hander(int signo)
{
    cout << "signo 2 reach" <<endl;
}

int main()
{
    signal(2, hander);
    //0.sigset_t是封装过的位图 -> 所以我们需要使用sig...系列函数才能对它进行操作
    //1.将内核中block表的2号信号位置1
    sigset_t set, odset;
    // 给位图做初始化动作
    sigemptyset(&set); 
    sigemptyset(&odset);
    // 将set位图中2号信号对应的比特位置1
    sigaddset(&set, 2); 
    // 通过系统调用接口将内核中的block中2号信号对应的比特位置1
    sigprocmask(SIG_SETMASK, &set, &odset); 

    sigset_t pending;
    int cnt = 0;
    sigemptyset(&pending);
    while (true)
    {
        // 将内核中的pending表拿到用户数据的pending中
        int n = sigpending(&pending);
        if(n == -1)
        {
            continue;
        }

        //2.观察pending表中的位图数据
        PrintPending(pending);

        //3.发送2号信号

        cnt++;
        if(cnt == 10)
        {
            //4.解除2号信号的阻塞阻塞
            sigprocmask(SIG_SETMASK, &odset, nullptr);
        }
    }

    return 0;
}